題目為給出一個紀錄學生成績的數量n,接著會給包含學生姓名與分數的資料,每個值都使用空格分隔。
最後一行query_name即要查詢的學生的姓名,需要我們找到特定學生獲得的分數的平均值,並且取到小數點後兩位。
if __name__ == '__main__':
n = int(input())
student_marks = {}
for _ in range(n):
name, *line = input().split()
scores = list(map(float, line))
student_marks[name] = scores
query_name = input()
print()
首先第一步,仍然還是要先了解程式碼再講些什麼,大致上解讀後,除了* line以外,其他都還能認得,於是便先開始尋找* line的涵義。
主要用途為分解可疊代的(Iterable)物件元素,在進行建立或合併時非常的實用。
根據網路上查到的資料,得知假設以下述的程式碼而言,line其實就等同於第一個資料以後,代表其他資料的一個運算子,如下方程式碼
name, *line = input().split()
#如果我input進去題目中的範例:Krishna 67 68 69
#則Krishna則為name *line則是67 68 69
#print一下就知道了
print(name)
print(*line)
#得到的答案分別為
#Krishna
#67 68 69
於是便知道了,題目中的初始程式碼中,意思是使用for in 將題目給予的答案,分別切割為name * line,
接著便要開始想如何print出特定學生獲得的分數的平均值,並且取到小數點後兩位。
由於我們已知sum()可以找列表的總和,而len()則是可以計算列表的個數
平均值即為round(sum(我們要找的那個學生的列表)/len(我們要找的那個學生的列表),2)
if __name__ == '__main__':
n = int(input())
student_marks = {}
for _ in range(n):
name, *line = input().split()
scores = list(map(float, line))
student_marks[name] = scores
query_name = input()
print(round(sum(student_marks[query_name])/len(scores)))
但當我輸入進題目後,卻是錯的,因為我沒有找到小數點後兩位,但我不是已經round小數點後兩位了嗎?
我就開始搜尋python如何保留小數點後兩位,最後得知原來round並不是取到小數倆後兩位的方式
round採用的並不是四捨五入, 而是依照指定的位數, 往前或是往後取最接近的數
於是在找尋了許多資料後,去除掉需要引進模組(decimal)的方式,便剩下字符串格式化(%.2f)的方式
將字符串格式化代入到程式碼運行後,便成功了這次的題目
if __name__ == '__main__':
n = int(input())
student_marks = {}
for _ in range(n):
name, *line = input().split()
scores = list(map(float, line))
student_marks[name] = scores #student_marks[krishna] = {67,68,69}
query_name = input()
score = sum(student_marks[query_name])/len(student_marks[query_name])
print("%.2f" % score)
參考資料:
保留小數點後兩位的方式: https://blog.csdn.net/Jerry_1126/article/details/85009810
round的解釋: https://dev.to/codemee/python-de-round-yu-decimal-mo-zu-269a
開箱運算子的解釋: https://www.learncodewithmike.com/2019/12/python-unpacking.html